Skip to main content

Esempio CNC 10: Programmazione di percorsi CNC dinamici

Vedi il CNC10_DynamicPath.project progetto di esempio nella directory di installazione di CODESYS sotto ..\CODESYS SoftMotion\Examples.

Questo esempio mostra come è possibile creare un percorso CNC direttamente nell'applicazione in fase di runtime, non alimentato con codice G da un oggetto programma CNC o da un file. Quando viene compilato questo tipo di programma CNC convenzionale, i dati del percorso vengono memorizzati in un file SMC_CNC_Data tipo di struttura dati. Questi dati interni vengono quindi compilati in specifiche strutture di dati globali a seconda della modalità di compilazione (SMC_CNC_REF o SMC_OutQueue).

In modalità traduzione SMC_CNC_REF i dati sono in una matrice di elementi di tipo SMC_GEOINFO salvato. L'array è in genere collegato all'istanza del blocco funzione nel codice dell'applicazione SMC_NCDecoder devolvere. In fase di esecuzione, i dati vengono qui decodificati e convertiti in una struttura dati globale di tipo SMC_OUTQUEUE scarti. Quindi è possibile richiamare i blocchi di preelaborazione del percorso.

In modalità traduzione SMC_OutQueue volere diretto una struttura dati globale (SMC_OUTQUEUE) viene generato, che nel codice dell'applicazione viene inviato all'interpolatore (istanza FB SMC_Interpolator) è passato. Il blocco funzione SMC_NCDecoder non è chiamato.

In modalità di compilazione FILE, i dati vengono archiviati in un file. I dati sono memorizzati come un array di elementi di tipo SMC_GEOINFO e corrispondono ai dati che vengono generati in modalità di compilazione SMC_CNC_REF.

Invece di programmare il percorso CNC, è possibile programmare un codice applicativo che istanzia una struttura dati di tipo SMC_OUTQUEUE in fase di esecuzione e ne assegna i valori. Si programma un percorso CNC che viene generato dinamicamente in runtime. È possibile passare la struttura dati ad altre istanze di blocchi funzione (ad esempio ai blocchi funzione di preelaborazione del percorso o al blocco funzione SMC_Interpolator).

Programmazione

Suggerimento

Nella directory di installazione di CODESYS trova il progetto di esempio CNCDynamicPath. Il progetto di esempio è stato rimosso dal progetto CNConline sviluppato. Contiene invece del percorso programmato graficamente Example il programma Path. Crea dinamicamente una struttura dati con tipo SMC_OUTQUEUE.

. Dichiarazione:
  • Dichiarare una struttura dati di tipo SMC_OUTQUEUE. La struttura dati contiene i dati del percorso CNC ed è popolata dinamicamente.

    Esempio: QUEUE

  • Allocare memoria per il percorso con la quantità richiesta a SMC_GEOINFO elementi.

    Esempio: BUF

  • Dichiarare una variabile di tipo SMC_GEOINFO con un primo passo.

    Esempio: GEO

. Implementazione:
  • Un elemento dell'array di tipo di dati SMC_GEOINFO corrisponde a un elemento del percorso nel codice CNC. I seguenti passaggi devono essere eseguiti per ogni elemento al fine di aggiungere l'elemento al SMC_OUTQUEUE:

  • Ogni elemento dell'array ha una posizione iniziale che corrisponde alla posizione finale dell'elemento dell'array precedente.

    Esempio: GEO.piStartPos.dX := 0; o GEO.piStartPos := GEO.piDestPos;

  • Determinare un tipo di movimento per ogni elemento dell'array.

    Esempio: GEO.iMoveType := CCLW; o GEO.iMoveType := LIN;

  • Imposta i parametri del tipo di movimento. Questo non è richiesto per tutti i tipi di movimento.

    Esempio: Per un arco (tipo di movimento: CCLW), è richiesta l'impostazione delle seguenti posizioni: geoinfo_A[i].dP1 := 200; geoinfo_A[i].dP2 := 100; geoinfo_A[i].dP3 := 50; geoinfo_A[i].dT1 := 0; geoinfo_A[i].dT2 := 90;

  • Inserire il calcolo della posizione finale.

    SMC_CalcEndPnt(ADR(GEO));

  • Inserisci il calcolo della lunghezza dell'oggetto.

    SMC_CalcLengthGeo(ADR(GEO));

  • Salva l'oggetto in QUEUE:

    SMC_AppendObj(POQ:=ADR(QUEUE), PGI:=ADR(GEO));

Quando il percorso è stato creato completamente, gli indicatori di fine devono essere impostati: QUEUE-bEndOfList = TRUE;

Suggerimento

Quindi, quando viene chiamato un blocco funzione di preelaborazione del percorso, è necessario impostare il bit di inizio o di fine per InternMark.

Esempio 50. Esempio

Percorso CNC con due elementi di percorso

In questo esempio, gli array non sono definiti con le posizioni X/Y. Se questo dovesse essere un esempio con due elementi di percorso come descritto, allora questi array dovrebbero avere due elementi ciascuno.

Ad esempio, derivato dal progetto di esempio:

xp:ARRAY[1..2] OF REAL:= [100,50]; yp:ARRAY[1..2] OF REAL:= [0,100];
PROGRAM Path
VAR
        iState : INT;
        QUEUE : SMC_OUTQUEUE;
        BUF : ARRAY[0..49] OF SMC_GEOINFO;
                // Memory allocation
        GEO : SMC_GEOINFO:=(dT1:=0, dT2:=1, dToolRadius:=0, dVel:=100, dVel_End:=100, dAccel:=200, dDecel:=500, iObj_Nr:=0);
                // Initial path element
        n : INT := 0;
        QUEUE.nSize := SIZEOF(BUF);
END_VAR

CASE iState OF
0:
        QUEUE.pbyBuffer := ADR(BUF[0]);
                // Initialize QUEUE
        SMC_SetQueueCapacity(ADR(QUEUE), SIZEOF(BUF));
        iState := iState + 1;

1:
        // Fill QUEUE
        WHILE NOT QUEUE.bFull DO
                // When QUEUE is full, wait until it has been processed by the following FBs
                n := n + 1;
                GEO.iSourceLine_No := n;
                GEO.piStartPos := GEO.piDestPos;
                        // Copying last destination
                GEO.iMoveType := LIN;
                        // Generating linear movement
                GEO.iObjNo := GEO.iObjNo + 1;
                        // Calculating number
                GEO.piDestPos.dX := xp[n];
                        // Generatint position
                GEO.piDestPos.dY := yp[n];
                SMC_CalcLengthGeo(pg := ADR(GEO));
                        // Calculating length of object with the help of the standard function
                SMC_AppendObj(poq:=ADR(QUEUE), pgi:=ADR(GEO));
                        // Appending object to QUEUE
                IF n = SIZEOF(xp)/SIZEOF(xp[1]) THEN
                        // All target positions processed
                        QUEUE.bEndOfList := TRUE;
                        n := 0;
                        iState := 2;
                        EXIT;
                END_IF
        END_WHILE

2:
        //Done
        ;
END_CASE

CheckVel(bExecute:=TRUE , poqDataIn:=ADR(queue)); // Preprocessing


Importante

Se la SMC_OUTQUEUE la struttura dei dati è popolata con SMC_GEOINFO data e l'elemento della struttura dei dati è stato impostato su bFULL = TRUE, quindi sconsigliamo un ulteriore incarico di SMC_GEOINFO dati. In questo caso, la creazione del percorso viene interrotta a runtime fino al primo elemento del SMC_OUTQUEUE la struttura dei dati viene elaborata nell'interpolatore. Solo allora viene inserito un altro elemento.

Evitare questa interruzione allocando memoria sufficiente. Vedi variabile BUF.

Importante

Se la struttura dei dati SMC_OUTQUEUE viene ricaricato dopo la prima esecuzione, quindi l'interpolatore e tutti i blocchi funzione di preelaborazione (esempio: SMC_CheckVelocities) devono essere riavviati con un fronte di salita a Execute.